<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>

    // 2. 函数版(简易工厂模式)
    // 优点 => 可以根据给定参数快速生成对
    // 缺点:
    // 1. 通过函数创建的对象和函数没有关系  => 不是通过构造函数创建的
    // 2. 公有的属性和方法重复声明 => 占内存

   /*  function cat(name,color) {
        var obj = { // 字面量对象 => new Object
            name: name,
            color: color,
            species: "Cat",
            skill() {
                console.log("捉老鼠");
            },
            call() {
                console.log("喵喵");
            }
        }
        return obj;
    }

    var Tom = cat("Tom","black");
    console.log(Tom);

    var Kitty = cat("Kitty","pink");
    console.log(Kitty);

    var Duola = cat("Duola","blue");
    console.log(Duola); */



    // 构造函数版
    // 1. 通过构造函数创建对象(实例化对象) => 根构造函数有关系

    // 但是此写法公有的属性和方法 => 还是重复创建 => 占内存

    function Cat(name,color) {
        // {}
        // this -> {};

        // 我们在自定义构造函数过程中 所做的操作  => 将属性和方法通过this绑定到实例化对象上
        this.name = name;
        this.color = color;

        // 公有的属性和方法
        this.species = "Cat";
        this.skill = function(){
            console.log("捉老鼠");
        }

        this.call = function(){
            console.log("喵喵");
        }

        // return this;
    }

    var Tom = new Cat("Tom","black");
    console.log(Tom, Tom instanceof Cat);

    var Kitty = new Cat("Kitty","pink");
    console.log(Kitty);

    var Duola = new Cat("Duola","blue");
    console.log(Duola);


</script>
</html>